{ "cells": [ { "cell_type": "markdown", "id": "10108f95", "metadata": {}, "source": [ "# はじめに" ] }, { "cell_type": "markdown", "id": "fb70e585", "metadata": {}, "source": [ "## 最良買い気配値と最良売り気配値の表示" ] }, { "cell_type": "code", "execution_count": 1, "id": "0f0e1b5a", "metadata": {}, "outputs": [], "source": [ "from numba import njit\n", "\n", "import numpy as np\n", "\n", "# numba.njit is strongly recommended for fast backtesting.\n", "@njit\n", "def print_bbo(hbt):\n", " # Iterating until hftbacktest reaches the end of data.\n", " # Elapses 60-sec every iteration.\n", " # Time unit is the same as data's timestamp's unit.\n", " # Timestamp of the sample data is in nanoseconds.\n", " while hbt.elapse(60 * 1e9) == 0: \n", " # Gets the market depth for the first asset.\n", " depth = hbt.depth(0)\n", "\n", " # Prints the best bid and the best offer.\n", " print(\n", " 'current_timestamp:', hbt.current_timestamp,\n", " ', best_bid:', np.round(depth.best_bid, 1),\n", " ', best_ask:', np.round(depth.best_ask, 1)\n", " )\n", " return True" ] }, { "cell_type": "code", "execution_count": 2, "id": "d9e717ec", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import BacktestAsset, HashMapMarketDepthBacktest\n", "\n", "asset = (\n", " BacktestAsset()\n", " # Sets the data to feed for this asset.\n", " #\n", " # Due to the vast size of tick-by-tick market depth and trade data,\n", " # loading the entire dataset into memory can be challenging,\n", " # particularly when backtesting across multiple days.\n", " # HftBacktest offers lazy loading support and is compatible with npy and preferably npz.\n", " #\n", " # For details on the normalized feed data, refer to the following documents.\n", " # * https://hftbacktest.readthedocs.io/en/latest/data.html \n", " # * https://hftbacktest.readthedocs.io/en/latest/tutorials/Data%20Preparation.html\n", " .data(['usdm/btcusdt_20240809.npz'])\n", " # Sets the initial snapshot (optional).\n", " .initial_snapshot('usdm/btcusdt_20240808_eod.npz')\n", " # Asset type:\n", " # * Linear\n", " # * Inverse.\n", " # 1.0 represents the contract size, which is the value of the asset per quoted price.\n", " .linear_asset(1.0) \n", " # HftBacktest provides two built-in latency models.\n", " # * constant_latency\n", " # * intp_order_latency\n", " # To implement your own latency model, please use Rust.\n", " # \n", " # Time unit is the same as data's timestamp's unit. Timestamp of the sample data is in nanoseconds.\n", " # Sets the order entry latency and response latency to 10ms.\n", " .constant_latency(10_000_000, 10_000_000)\n", " # HftBacktest provides several types of built-in queue position models.\n", " # Please find the details in the documents below.\n", " # https://hftbacktest.readthedocs.io/en/latest/tutorials/Probability%20Queue%20Models.html\n", " #\n", " # To implement your own queue position model, please use Rust.\n", " .risk_adverse_queue_model() \n", " # HftBacktest provides two built-in exchange models.\n", " # * no_partial_fill_exchange\n", " # * partial_fill_exchange\n", " # To implement your own exchange model, please use Rust.\n", " .no_partial_fill_exchange()\n", " # HftBacktest provides several built-in fee models.\n", " # * trading_value_fee_model\n", " # * trading_qty_fee_model\n", " # * flat_per_trade_fee_model\n", " #\n", " # 0.02% maker fee and 0.07% taker fee. If the fee is negative, it represents a rebate.\n", " # For example, -0.00005 represents a 0.005% rebate for the maker order.\n", " .trading_value_fee_model(0.0002, 0.0007)\n", " # Tick size of this asset: minimum price increasement\n", " .tick_size(0.1)\n", " # Lot size of this asset: minimum trading unit.\n", " .lot_size(0.001)\n", " # Sets the capacity of the vector that stores trades occurring in the market.\n", " # If you set the size, you need call `clear_last_trades` to clear the vector.\n", " # A value of 0 indicates that no market trades are stored. (Default)\n", " .last_trades_capacity(0)\n", ")\n", "\n", "# HftBacktest provides several types of built-in market depth implementations.\n", "# HashMapMarketDepthBacktest constructs a Backtest using a HashMap-based market depth implementation.\n", "# Another useful implementation is ROIVectorMarketDepth, which is utilized in ROIVectorMarketDepthBacktest.\n", "# Please find the details in the document below.\n", "hbt = HashMapMarketDepthBacktest([asset])" ] }, { "cell_type": "markdown", "id": "0d4ecb19", "metadata": {}, "source": [ "最良買い気配値と最良売り気配値を60秒ごとに確認できます。価格は32ビット浮動小数点数であるため、浮動小数点誤差が発生する可能性があります。使用する際には注意してください。例では、読みやすさのために価格がティックサイズに基づいて丸められています。" ] }, { "cell_type": "code", "execution_count": 3, "id": "128fb48a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , best_bid: 61594.1 , best_ask: 61594.2\n", "current_timestamp: 1723161721500000000 , best_bid: 61576.5 , best_ask: 61576.6\n", "current_timestamp: 1723161781500000000 , best_bid: 61629.6 , best_ask: 61629.7\n", "current_timestamp: 1723161841500000000 , best_bid: 61621.5 , best_ask: 61621.6\n", "current_timestamp: 1723161901500000000 , best_bid: 61583.9 , best_ask: 61584.0\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print_bbo(hbt)" ] }, { "cell_type": "markdown", "id": "5b316f2f-433c-423e-83a3-95451f4951e8", "metadata": {}, "source": [ "HftBacktestは再利用できません。したがって、バックテストを使用した後は必ず閉じてください。閉じた後にバックテストを使用するとクラッシュします。" ] }, { "cell_type": "code", "execution_count": 4, "id": "7a2be482-1796-4aa3-8781-8fc991e93064", "metadata": {}, "outputs": [], "source": [ "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "7754e06a", "metadata": {}, "source": [ "## データのフィード" ] }, { "cell_type": "markdown", "id": "b0003e60", "metadata": {}, "source": [ "十分なメモリを持っている場合、データをメモリに事前ロードし、繰り返しバックテスト中に遅延ロードするよりも効率的に入力することができます。" ] }, { "cell_type": "code", "execution_count": 5, "id": "7dca08d3-4434-4410-9952-8b20ffe07670", "metadata": {}, "outputs": [], "source": [ "btcusdt_20230809 = np.load('usdm/btcusdt_20240809.npz')['data']\n", "btcusdt_20230808_eod = np.load('usdm/btcusdt_20240808_eod.npz')['data']\n", "\n", "asset = (\n", " BacktestAsset()\n", " .data([btcusdt_20230809])\n", " .initial_snapshot(btcusdt_20230808_eod)\n", " .linear_asset(1.0) \n", " .constant_latency(10_000_000, 10_000_000)\n", " .risk_adverse_queue_model() \n", " .no_partial_fill_exchange()\n", " .trading_value_fee_model(0.0002, 0.0007)\n", " .tick_size(0.1)\n", " .lot_size(0.001)\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "id": "d4b907f3-fc83-4ca9-8c95-7475f2bc0e3c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , best_bid: 61594.1 , best_ask: 61594.2\n", "current_timestamp: 1723161721500000000 , best_bid: 61576.5 , best_ask: 61576.6\n", "current_timestamp: 1723161781500000000 , best_bid: 61629.6 , best_ask: 61629.7\n", "current_timestamp: 1723161841500000000 , best_bid: 61621.5 , best_ask: 61621.6\n", "current_timestamp: 1723161901500000000 , best_bid: 61583.9 , best_ask: 61584.0\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "print_bbo(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "6ec3131e", "metadata": {}, "source": [ "## 市場深度の取得" ] }, { "cell_type": "code", "execution_count": 7, "id": "467b649d", "metadata": {}, "outputs": [], "source": [ "@njit\n", "def print_3depth(hbt):\n", " while hbt.elapse(60 * 1e9) == 0:\n", " print('current_timestamp:', hbt.current_timestamp)\n", "\n", " # Gets the market depth for the first asset, in the same order as when you created the backtest.\n", " depth = hbt.depth(0)\n", "\n", " # a key of bid_depth or ask_depth is price in ticks.\n", " # (integer) price_tick = price / tick_size\n", " i = 0\n", " for tick_price in range(depth.best_ask_tick, depth.best_ask_tick + 100):\n", " qty = depth.ask_qty_at_tick(tick_price)\n", " if qty > 0:\n", " print(\n", " 'ask: ',\n", " qty,\n", " '@',\n", " np.round(tick_price * depth.tick_size, 1)\n", " )\n", " \n", " i += 1\n", " if i == 3:\n", " break\n", " i = 0\n", " for tick_price in range(depth.best_bid_tick, max(depth.best_bid_tick - 100, 0), -1):\n", " qty = depth.bid_qty_at_tick(tick_price)\n", " if qty > 0:\n", " print(\n", " 'bid: ',\n", " qty,\n", " '@',\n", " np.round(tick_price * depth.tick_size, 1)\n", " )\n", " \n", " i += 1\n", " if i == 3:\n", " break\n", " return True" ] }, { "cell_type": "code", "execution_count": 8, "id": "74311eb7-ecb5-4c61-b677-f8373a9169d4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000\n", "ask: 1.759 @ 61594.2\n", "ask: 0.006 @ 61594.4\n", "ask: 0.114 @ 61595.2\n", "bid: 3.526 @ 61594.1\n", "bid: 0.016 @ 61594.0\n", "bid: 0.002 @ 61593.9\n", "current_timestamp: 1723161721500000000\n", "ask: 2.575 @ 61576.6\n", "ask: 0.004 @ 61576.7\n", "ask: 0.455 @ 61577.0\n", "bid: 2.558 @ 61576.5\n", "bid: 0.002 @ 61576.0\n", "bid: 0.515 @ 61575.5\n", "current_timestamp: 1723161781500000000\n", "ask: 0.131 @ 61629.7\n", "ask: 0.005 @ 61630.1\n", "ask: 0.005 @ 61630.5\n", "bid: 5.742 @ 61629.6\n", "bid: 0.247 @ 61629.4\n", "bid: 0.034 @ 61629.3\n", "current_timestamp: 1723161841500000000\n", "ask: 0.202 @ 61621.6\n", "ask: 0.002 @ 61622.5\n", "ask: 0.003 @ 61622.6\n", "bid: 3.488 @ 61621.5\n", "bid: 0.86 @ 61620.0\n", "bid: 0.248 @ 61619.6\n", "current_timestamp: 1723161901500000000\n", "ask: 1.397 @ 61584.0\n", "ask: 0.832 @ 61585.1\n", "ask: 0.132 @ 61586.0\n", "bid: 3.307 @ 61583.9\n", "bid: 0.01 @ 61583.8\n", "bid: 0.002 @ 61582.0\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "print_3depth(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "b27f7386", "metadata": {}, "source": [ "## 注文の提出" ] }, { "cell_type": "code", "execution_count": 9, "id": "d5e29cfe", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import LIMIT, GTC, NONE, NEW, FILLED, CANCELED, EXPIRED\n", "\n", "@njit\n", "def print_orders(hbt):\n", " # You can access open orders and also closed orders via hbt.orders.\n", " # Gets the OrderDict for the first asset.\n", " orders = hbt.orders(0)\n", " \n", " # hbt.orders is a dictionary, but be aware that it does not support all dict methods, and its keys are order_id (int).\n", " order_values = orders.values()\n", " while order_values.has_next():\n", " order = order_values.get()\n", " \n", " order_status = ''\n", " if order.status == NONE:\n", " order_status = 'NONE' # Exchange hasn't received an order yet.\n", " elif order.status == NEW:\n", " order_status = 'NEW'\n", " elif order.status == FILLED:\n", " order_status = 'FILLED'\n", " elif order.status == CANCELED:\n", " order_status = 'CANCELED'\n", " elif order.status == EXPIRED:\n", " order_status = 'EXPIRED' \n", " \n", " order_req = ''\n", " if order.req == NONE:\n", " order_req = 'NONE'\n", " elif order.req == NEW:\n", " order_req = 'NEW'\n", " elif order.req == CANCELED:\n", " order_req = 'CANCEL'\n", " \n", " print(\n", " 'current_timestamp:', hbt.current_timestamp, \n", " ', order_id:', order.order_id,\n", " ', order_price:', np.round(order.price, 1),\n", " ', order_qty:', order.qty,\n", " ', order_status:', order_status,\n", " ', order_req:', order_req\n", " )\n", "\n", "@njit\n", "def submit_order(hbt):\n", " is_order_submitted = False\n", " while hbt.elapse(30 * 1e9) == 0:\n", " # Prints open orders.\n", " print_orders(hbt)\n", "\n", " depth = hbt.depth(0)\n", " \n", " if not is_order_submitted:\n", " # Submits a buy order at 300 ticks below the best bid for the first asset.\n", " order_id = 1\n", " order_price = depth.best_bid - 300 * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTC # Good 'till cancel\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " is_order_submitted = True\n", " return True" ] }, { "cell_type": "code", "execution_count": 10, "id": "ade32153", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161691500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161721500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161751500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161781500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161811500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161841500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161871500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161901500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "submit_order(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "edcdf5c0", "metadata": {}, "source": [ "## 非アクティブな注文のクリア (FILLED, CANCELED, EXPIRED)" ] }, { "cell_type": "code", "execution_count": 11, "id": "f163eef1", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import GTC\n", "\n", "@njit\n", "def clear_inactive_orders(hbt):\n", " is_order_submitted = False\n", " while hbt.elapse(30 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " # Removes inactive(FILLED, CANCELED, EXPIRED) orders from hbt.orders for the first asset.\n", " hbt.clear_inactive_orders(0)\n", "\n", " depth = hbt.depth(0)\n", " \n", " if not is_order_submitted:\n", " order_id = 1\n", " order_price = depth.best_bid - 300 * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTC\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " is_order_submitted = True\n", " return True" ] }, { "cell_type": "code", "execution_count": 12, "id": "821f9e56-5611-4e58-8b88-611fd277144f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , order_id: 1 , order_price: 61643.8 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "clear_inactive_orders(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "0d6d85dd", "metadata": {}, "source": [ "## 注文ステータスの監視 - 注文遅延による保留中" ] }, { "cell_type": "code", "execution_count": 13, "id": "859bca22", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import GTC\n", "\n", "@njit\n", "def watch_pending(hbt):\n", " is_order_submitted = False\n", " # Elapses 0.01-sec every iteration.\n", " while hbt.elapse(0.01 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " hbt.clear_inactive_orders(0)\n", "\n", " depth = hbt.depth(0)\n", " \n", " if not is_order_submitted:\n", " order_id = 1\n", " order_price = depth.best_bid - 300 * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTC\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " is_order_submitted = True\n", " \n", " # Prevents too many prints\n", " orders = hbt.orders(0)\n", " order = orders.get(order_id)\n", " if order.status == NEW:\n", " return False\n", " return True" ] }, { "cell_type": "markdown", "id": "8ea8e3c4-b972-4472-ab33-2f79eba54035", "metadata": {}, "source": [ "`order_status`は受け入れメッセージが受信されるまで`None`です。" ] }, { "cell_type": "code", "execution_count": 14, "id": "a0c2e47e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161601520000000 , order_id: 1 , order_price: 61629.7 , order_qty: 1.0 , order_status: NONE , order_req: NEW\n", "current_timestamp: 1723161601530000000 , order_id: 1 , order_price: 61629.7 , order_qty: 1.0 , order_status: NEW , order_req: NONE\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "watch_pending(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "00c1f5ed", "metadata": {}, "source": [ "## 注文応答の待機" ] }, { "cell_type": "code", "execution_count": 15, "id": "b2e43564", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import GTC\n", "\n", "@njit\n", "def wait_for_order_response(hbt):\n", " order_id = 0\n", " is_order_submitted = False\n", " while hbt.elapse(0.01 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " hbt.clear_inactive_orders(0)\n", " \n", " # Prevents too many prints\n", " orders = hbt.orders(0)\n", " if order_id in orders:\n", " if orders.get(order_id).status == NEW:\n", " return False\n", "\n", " depth = hbt.depth(0)\n", " \n", " if not is_order_submitted:\n", " order_id = 1\n", " order_price = depth.best_bid\n", " order_qty = 1\n", " time_in_force = GTC\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " # Waits for the order response for a given order id for the first asset.\n", " print('an order is submitted at', hbt.current_timestamp)\n", "\n", " # Timeout is set 1-second.\n", " hbt.wait_order_response(0, order_id, 1 * 1e9)\n", " print('an order response is received at', hbt.current_timestamp)\n", " is_order_submitted = True\n", " return True" ] }, { "cell_type": "markdown", "id": "41d43022-fcef-4d73-a8fd-4d94ad1b8e29", "metadata": {}, "source": [ "`ConstantLatency`モデルが使用されているため、往復遅延は正確に200msです。理想的には、ライブ市場から収集された履歴注文遅延データを使用するのが最良のアプローチです。ただし、このデータが利用できない場合は、フィード遅延に基づいて人工的に生成された注文遅延を使用することから始めるのも一つの方法です。これについては、次の例で詳しく説明します。" ] }, { "cell_type": "code", "execution_count": 16, "id": "fcfb211b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "an order is submitted at 1723161601510000000\n", "an order response is received at 1723161601530000000\n", "current_timestamp: 1723161601540000000 , order_id: 1 , order_price: 61659.7 , order_qty: 1.0 , order_status: NEW , order_req: NONE\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "wait_for_order_response(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "b8c27280", "metadata": {}, "source": [ "## ポジション、残高、手数料、エクイティの表示" ] }, { "cell_type": "code", "execution_count": 17, "id": "c38365d8", "metadata": {}, "outputs": [], "source": [ "@njit\n", "def position(hbt):\n", " is_order_submitted = False\n", " while hbt.elapse(60 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " hbt.clear_inactive_orders(0)\n", " \n", " # Prints position\n", " print(\n", " 'current_timestamp:', hbt.current_timestamp,\n", " ', position:', hbt.position(0),\n", " ', balance:', hbt.state_values(0).balance,\n", " ', fee:', hbt.state_values(0).fee\n", " )\n", "\n", " depth = hbt.depth(0)\n", " \n", " if not is_order_submitted:\n", " order_id = 1\n", " order_price = depth.best_bid\n", " order_qty = 1\n", " time_in_force = GTC\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " \n", " # Timeout is set 1-second.\n", " hbt.wait_order_response(0, order_id, 1e9)\n", " is_order_submitted = True\n", " return True" ] }, { "cell_type": "code", "execution_count": 18, "id": "a9cf70b2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n", "current_timestamp: 1723161721520000000 , order_id: 1 , order_price: 61594.1 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161721520000000 , position: 1.0 , balance: -61594.100000000006 , fee: 12.318820000000002\n", "current_timestamp: 1723161781520000000 , position: 1.0 , balance: -61594.100000000006 , fee: 12.318820000000002\n", "current_timestamp: 1723161841520000000 , position: 1.0 , balance: -61594.100000000006 , fee: 12.318820000000002\n", "current_timestamp: 1723161901520000000 , position: 1.0 , balance: -61594.100000000006 , fee: 12.318820000000002\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "position(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "7d6c739c", "metadata": {}, "source": [ "## オープン注文のキャンセル" ] }, { "cell_type": "code", "execution_count": 19, "id": "502bf0f6", "metadata": {}, "outputs": [], "source": [ "@njit\n", "def submit_and_cancel_order(hbt):\n", " is_order_submitted = False\n", " while hbt.elapse(0.1 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " hbt.clear_inactive_orders(0)\n", " \n", " # Cancels if there is an open order\n", " orders = hbt.orders(0)\n", " order_values = orders.values()\n", " while order_values.has_next():\n", " order = order_values.get()\n", " \n", " # an order is only cancellable if order status is NEW.\n", " # cancel request is negated if the order is already filled or filled before cancel request is processed.\n", " if order.cancellable:\n", " hbt.cancel(0, order.order_id, False)\n", " # You can see status still NEW and see req CANCEL.\n", " print_orders(hbt)\n", " # cancels request also has order entry/response latencies the same as submitting.\n", " hbt.wait_order_response(0, order.order_id, 1e9)\n", " \n", " if not is_order_submitted:\n", " depth = hbt.depth(0)\n", " \n", " order_id = 1\n", " order_price = depth.best_bid - 100 * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTC\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " \n", " # Timeout is set 1-second.\n", " hbt.wait_order_response(0, order_id, 1e9)\n", " is_order_submitted = True\n", " else:\n", " if len(hbt.orders(0)) == 0:\n", " return False\n", " return True" ] }, { "cell_type": "code", "execution_count": 20, "id": "638c3012", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161601720000000 , order_id: 1 , order_price: 61649.7 , order_qty: 1.0 , order_status: NEW , order_req: NONE\n", "current_timestamp: 1723161601720000000 , order_id: 1 , order_price: 61649.7 , order_qty: 1.0 , order_status: NEW , order_req: CANCEL\n", "current_timestamp: 1723161601840000000 , order_id: 1 , order_price: 61649.7 , order_qty: 1.0 , order_status: CANCELED , order_req: NONE\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "submit_and_cancel_order(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "6a60476c", "metadata": {}, "source": [ "## 成行注文" ] }, { "cell_type": "code", "execution_count": 21, "id": "9e87515b", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import MARKET\n", "\n", "@njit\n", "def print_orders_exec_price(hbt):\n", " orders = hbt.orders(0)\n", " order_values = orders.values()\n", " while order_values.has_next():\n", " order = order_values.get()\n", " \n", " order_status = ''\n", " if order.status == NONE:\n", " order_status = 'NONE'\n", " elif order.status == NEW:\n", " order_status = 'NEW'\n", " elif order.status == FILLED:\n", " order_status = 'FILLED'\n", " elif order.status == CANCELED:\n", " order_status = 'CANCELED'\n", " elif order.status == EXPIRED:\n", " order_status = 'EXPIRED' \n", " \n", " order_req = ''\n", " if order.req == NONE:\n", " order_req = 'NONE'\n", " elif order.req == NEW:\n", " order_req = 'NEW'\n", " elif order.req == CANCELED:\n", " order_req = 'CANCEL'\n", " \n", " print(\n", " 'current_timestamp:', hbt.current_timestamp, \n", " ', order_id:', order.order_id,\n", " ', order_price:', np.round(order.price, 1),\n", " ', order_qty:', order.qty,\n", " ', order_status:', order_status,\n", " ', exec_price:', np.round(order.exec_price, 1)\n", " )\n", " \n", "@njit\n", "def market_order(hbt):\n", " is_order_submitted = False\n", " while hbt.elapse(60 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " hbt.clear_inactive_orders(0)\n", "\n", " state_values = hbt.state_values(0)\n", " \n", " print(\n", " 'current_timestamp:', hbt.current_timestamp,\n", " ', position:', hbt.position(0),\n", " ', balance:', state_values.balance,\n", " ', fee:', state_values.fee\n", " )\n", " \n", " if not is_order_submitted:\n", " depth = hbt.depth(0)\n", " \n", " order_id = 1\n", " # Sets an arbitrary price, which does not affect MARKET orders.\n", " order_price = depth.best_bid\n", " order_qty = 1\n", " time_in_force = GTC\n", " order_type = MARKET\n", " hbt.submit_sell_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " hbt.wait_order_response(0, order_id, 1e9)\n", " # You can see the order immediately filled.\n", " # Also you can see the order executed at the best bid which is different from what it was submitted at.\n", " print('best_bid:', depth.best_bid)\n", " print_orders_exec_price(hbt) \n", " is_order_submitted = True\n", " return True" ] }, { "cell_type": "code", "execution_count": 22, "id": "0b6003d9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n", "best_bid: 61594.100000000006\n", "current_timestamp: 1723161661520000000 , order_id: 1 , order_price: 61594.1 , order_qty: 1.0 , order_status: FILLED , exec_price: 61594.1\n", "current_timestamp: 1723161721520000000 , order_id: 1 , order_price: 61594.1 , order_qty: 1.0 , order_status: FILLED , order_req: NONE\n", "current_timestamp: 1723161721520000000 , position: -1.0 , balance: 61594.100000000006 , fee: 43.11587\n", "current_timestamp: 1723161781520000000 , position: -1.0 , balance: 61594.100000000006 , fee: 43.11587\n", "current_timestamp: 1723161841520000000 , position: -1.0 , balance: 61594.100000000006 , fee: 43.11587\n", "current_timestamp: 1723161901520000000 , position: -1.0 , balance: 61594.100000000006 , fee: 43.11587\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "market_order(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "980ebc4d", "metadata": {}, "source": [ "## GTX, Post-Only注文" ] }, { "cell_type": "code", "execution_count": 23, "id": "1b0255bb", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import GTX\n", "\n", "@njit\n", "def submit_gtx(hbt):\n", " is_order_submitted = False\n", " while hbt.elapse(60 * 1e9) == 0:\n", " print_orders(hbt)\n", " \n", " hbt.clear_inactive_orders(0)\n", " \n", " state_values = hbt.state_values(0)\n", " \n", " print(\n", " 'current_timestamp:', hbt.current_timestamp,\n", " ', position:', hbt.position(0),\n", " ', balance:', state_values.balance,\n", " ', fee:', state_values.fee\n", " )\n", " \n", " if not is_order_submitted:\n", " depth = hbt.depth(0)\n", " \n", " order_id = 1\n", " # Sets a deep price in the opposite side and it will be rejected by GTX.\n", " order_price = depth.best_bid - 100 * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTX\n", " order_type = LIMIT\n", " hbt.submit_sell_order(0, order_id, order_price, order_qty, time_in_force, order_type, False)\n", " hbt.wait_order_response(0, order_id, 1e9)\n", " is_order_submitted = True\n", " return True" ] }, { "cell_type": "code", "execution_count": 24, "id": "f1030532", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "current_timestamp: 1723161661500000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n", "current_timestamp: 1723161721520000000 , order_id: 1 , order_price: 61584.1 , order_qty: 1.0 , order_status: EXPIRED , order_req: NONE\n", "current_timestamp: 1723161721520000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n", "current_timestamp: 1723161781520000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n", "current_timestamp: 1723161841520000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n", "current_timestamp: 1723161901520000000 , position: 0.0 , balance: 0.0 , fee: 0.0\n" ] } ], "source": [ "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "submit_gtx(hbt)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "eff830d3", "metadata": {}, "source": [ "## BBOのプロット" ] }, { "cell_type": "code", "execution_count": 25, "id": "641721c6", "metadata": {}, "outputs": [], "source": [ "@njit\n", "def plot_bbo(hbt, local_timestamp, best_bid, best_ask):\n", " while hbt.elapse(1 * 1e9) == 0:\n", " # Records data points\n", " local_timestamp.append(hbt.current_timestamp)\n", "\n", " depth = hbt.depth(0)\n", " \n", " best_bid.append(depth.best_bid)\n", " best_ask.append(depth.best_ask)\n", " return True" ] }, { "cell_type": "code", "execution_count": 26, "id": "9ecfecc8", "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", " var py_version = '3.4.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n", " var reloading = false;\n", " var Bokeh = root.Bokeh;\n", "\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks;\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", " if (js_modules == null) js_modules = [];\n", " if (js_exports == null) js_exports = {};\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", "\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " if (!reloading) {\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " }\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", " window._bokeh_on_load = on_load\n", "\n", " function on_error() {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " var skip = [];\n", " if (window.requirejs) {\n", " window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n", " root._bokeh_is_loading = css_urls.length + 0;\n", " } else {\n", " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", " }\n", "\n", " var existing_stylesheets = []\n", " var links = document.getElementsByTagName('link')\n", " for (var i = 0; i < links.length; i++) {\n", " var link = links[i]\n", " if (link.href != null) {\n", "\texisting_stylesheets.push(link.href)\n", " }\n", " }\n", " for (var i = 0; i < css_urls.length; i++) {\n", " var url = css_urls[i];\n", " if (existing_stylesheets.indexOf(url) !== -1) {\n", "\ton_load()\n", "\tcontinue;\n", " }\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " } var existing_scripts = []\n", " var scripts = document.getElementsByTagName('script')\n", " for (var i = 0; i < scripts.length; i++) {\n", " var script = scripts[i]\n", " if (script.src != null) {\n", "\texisting_scripts.push(script.src)\n", " }\n", " }\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " for (var i = 0; i < js_modules.length; i++) {\n", " var url = js_modules[i];\n", " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " element.type = \"module\";\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " for (const name in js_exports) {\n", " var url = js_exports[name];\n", " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.type = \"module\";\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " element.textContent = `\n", " import ${name} from \"${url}\"\n", " window.${name} = ${name}\n", " window._bokeh_on_load()\n", " `\n", " document.head.appendChild(element);\n", " }\n", " if (!js_urls.length && !js_modules.length) {\n", " on_load()\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.2.min.js\", \"https://cdn.holoviz.org/panel/1.4.4/dist/panel.min.js\"];\n", " var js_modules = [];\n", " var js_exports = {};\n", " var css_urls = [];\n", " var inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {} // ensure no trailing comma for IE\n", " ];\n", "\n", " function run_inline_js() {\n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", "\ttry {\n", " inline_js[i].call(root, root.Bokeh);\n", "\t} catch(e) {\n", "\t if (!reloading) {\n", "\t throw e;\n", "\t }\n", "\t}\n", " }\n", " // Cache old bokeh versions\n", " if (Bokeh != undefined && !reloading) {\n", "\tvar NewBokeh = root.Bokeh;\n", "\tif (Bokeh.versions === undefined) {\n", "\t Bokeh.versions = new Map();\n", "\t}\n", "\tif (NewBokeh.version !== Bokeh.version) {\n", "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", "\t}\n", "\troot.Bokeh = Bokeh;\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " }\n", " root._bokeh_is_initializing = false\n", " }\n", "\n", " function load_or_wait() {\n", " // Implement a backoff loop that tries to ensure we do not load multiple\n", " // versions of Bokeh and its dependencies at the same time.\n", " // In recent versions we use the root._bokeh_is_initializing flag\n", " // to determine whether there is an ongoing attempt to initialize\n", " // bokeh, however for backward compatibility we also try to ensure\n", " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", " // before older versions are fully initialized.\n", " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", " root._bokeh_is_initializing = false;\n", " root._bokeh_onload_callbacks = undefined;\n", " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", " load_or_wait();\n", " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", " setTimeout(load_or_wait, 100);\n", " } else {\n", " root._bokeh_is_initializing = true\n", " root._bokeh_onload_callbacks = []\n", " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", " if (!reloading && !bokeh_loaded) {\n", "\troot.Bokeh = undefined;\n", " }\n", " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", "\trun_inline_js();\n", " });\n", " }\n", " }\n", " // Give older versions of the autoload script a head-start to ensure\n", " // they initialize before we start loading newer version.\n", " setTimeout(load_or_wait, 100)\n", "}(window));" ], "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.4.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = false;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.2.min.js\", \"https://cdn.holoviz.org/panel/1.4.4/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", "}\n", "\n", "\n", " function JupyterCommManager() {\n", " }\n", "\n", " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", " comm_manager.register_target(comm_id, function(comm) {\n", " comm.on_msg(msg_handler);\n", " });\n", " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", " comm.onMsg = msg_handler;\n", " });\n", " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", " var messages = comm.messages[Symbol.asyncIterator]();\n", " function processIteratorResult(result) {\n", " var message = result.value;\n", " console.log(message)\n", " var content = {data: message.data, comm_id};\n", " var buffers = []\n", " for (var buffer of message.buffers || []) {\n", " buffers.push(new DataView(buffer))\n", " }\n", " var metadata = message.metadata || {};\n", " var msg = {content, buffers, metadata}\n", " msg_handler(msg);\n", " return messages.next().then(processIteratorResult);\n", " }\n", " return messages.next().then(processIteratorResult);\n", " })\n", " }\n", " }\n", "\n", " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", " if (comm_id in window.PyViz.comms) {\n", " return window.PyViz.comms[comm_id];\n", " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", " if (msg_handler) {\n", " comm.on_msg(msg_handler);\n", " }\n", " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", " comm.open();\n", " if (msg_handler) {\n", " comm.onMsg = msg_handler;\n", " }\n", " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", " comm_promise.then((comm) => {\n", " window.PyViz.comms[comm_id] = comm;\n", " if (msg_handler) {\n", " var messages = comm.messages[Symbol.asyncIterator]();\n", " function processIteratorResult(result) {\n", " var message = result.value;\n", " var content = {data: message.data};\n", " var metadata = message.metadata || {comm_id};\n", " var msg = {content, metadata}\n", " msg_handler(msg);\n", " return messages.next().then(processIteratorResult);\n", " }\n", " return messages.next().then(processIteratorResult);\n", " }\n", " }) \n", " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", " return comm_promise.then((comm) => {\n", " comm.send(data, metadata, buffers, disposeOnDone);\n", " });\n", " };\n", " var comm = {\n", " send: sendClosure\n", " };\n", " }\n", " window.PyViz.comms[comm_id] = comm;\n", " return comm;\n", " }\n", " window.PyViz.comm_manager = new JupyterCommManager();\n", " \n", "\n", "\n", "var JS_MIME_TYPE = 'application/javascript';\n", "var HTML_MIME_TYPE = 'text/html';\n", "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", "var CLASS_NAME = 'output';\n", "\n", "/**\n", " * Render data to the DOM node\n", " */\n", "function render(props, node) {\n", " var div = document.createElement(\"div\");\n", " var script = document.createElement(\"script\");\n", " node.appendChild(div);\n", " node.appendChild(script);\n", "}\n", "\n", "/**\n", " * Handle when a new output is added\n", " */\n", "function handle_add_output(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", " if (id !== undefined) {\n", " var nchildren = toinsert.length;\n", " var html_node = toinsert[nchildren-1].children[0];\n", " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", " var scripts = [];\n", " var nodelist = html_node.querySelectorAll(\"script\");\n", " for (var i in nodelist) {\n", " if (nodelist.hasOwnProperty(i)) {\n", " scripts.push(nodelist[i])\n", " }\n", " }\n", "\n", " scripts.forEach( function (oldScript) {\n", " var newScript = document.createElement(\"script\");\n", " var attrs = [];\n", " var nodemap = oldScript.attributes;\n", " for (var j in nodemap) {\n", " if (nodemap.hasOwnProperty(j)) {\n", " attrs.push(nodemap[j])\n", " }\n", " }\n", " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", " oldScript.parentNode.replaceChild(newScript, oldScript);\n", " });\n", " if (JS_MIME_TYPE in output.data) {\n", " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", " }\n", " output_area._hv_plot_id = id;\n", " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", " window.PyViz.plot_index[id] = Bokeh.index[id];\n", " } else {\n", " window.PyViz.plot_index[id] = null;\n", " }\n", " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", "}\n", "\n", "/**\n", " * Handle when an output is cleared or removed\n", " */\n", "function handle_clear_output(event, handle) {\n", " var id = handle.cell.output_area._hv_plot_id;\n", " var server_id = handle.cell.output_area._bokeh_server_id;\n", " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", " if (server_id !== null) {\n", " comm.send({event_type: 'server_delete', 'id': server_id});\n", " return;\n", " } else if (comm !== null) {\n", " comm.send({event_type: 'delete', 'id': id});\n", " }\n", " delete PyViz.plot_index[id];\n", " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", " var doc = window.Bokeh.index[id].model.document\n", " doc.clear();\n", " const i = window.Bokeh.documents.indexOf(doc);\n", " if (i > -1) {\n", " window.Bokeh.documents.splice(i, 1);\n", " }\n", " }\n", "}\n", "\n", "/**\n", " * Handle kernel restart event\n", " */\n", "function handle_kernel_cleanup(event, handle) {\n", " delete PyViz.comms[\"hv-extension-comm\"];\n", " window.PyViz.plot_index = {}\n", "}\n", "\n", "/**\n", " * Handle update_display_data messages\n", " */\n", "function handle_update_output(event, handle) {\n", " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", " handle_add_output(event, handle)\n", "}\n", "\n", "function register_renderer(events, OutputArea) {\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[0]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " events.on('output_added.OutputArea', handle_add_output);\n", " events.on('output_updated.OutputArea', handle_update_output);\n", " events.on('clear_output.CodeCell', handle_clear_output);\n", " events.on('delete.Cell', handle_clear_output);\n", " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", "\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " safe: true,\n", " index: 0\n", " });\n", "}\n", "\n", "if (window.Jupyter !== undefined) {\n", " try {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " } catch(err) {\n", " }\n", "}\n" ], "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ] }, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p1002" } }, "output_type": "display_data" }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":NdOverlay [Variable]\n", " :Curve [timestamp] (value)" ] }, "execution_count": 26, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p1004" } }, "output_type": "execute_result" } ], "source": [ "# Uses Numba list for njit.\n", "from numba.typed import List\n", "from numba import int64, float64\n", "\n", "import polars as pl\n", "\n", "local_timestamp = List.empty_list(int64, allocated=10000)\n", "best_bid = List.empty_list(float64, allocated=10000)\n", "best_ask = List.empty_list(float64, allocated=10000)\n", "\n", "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "plot_bbo(hbt, local_timestamp, best_bid, best_ask)\n", "\n", "hbt.close()\n", "\n", "df = pl.DataFrame({'timestamp': local_timestamp, 'best_bid': best_bid, 'best_ask': best_ask})\n", "df = df.with_columns(\n", " pl.from_epoch('timestamp', time_unit='ns')\n", ")\n", "\n", "df.plot(x='timestamp')" ] }, { "cell_type": "markdown", "id": "1069fc95", "metadata": {}, "source": [ "## 統計の表示" ] }, { "cell_type": "code", "execution_count": 27, "id": "e001470d", "metadata": {}, "outputs": [], "source": [ "@njit\n", "def submit_order_stats(hbt, recorder):\n", " buy_order_id = 1\n", " sell_order_id = 2\n", " half_spread = 5 * hbt.depth(0).tick_size\n", " \n", " while hbt.elapse(1 * 1e9) == 0:\n", " hbt.clear_inactive_orders(0)\n", "\n", " depth = hbt.depth(0)\n", " \n", " mid_price = (depth.best_bid + depth.best_ask) / 2.0\n", " \n", " if buy_order_id not in hbt.orders(0):\n", " order_price = round((mid_price - half_spread) / depth.tick_size) * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTX\n", " order_type = LIMIT\n", " hbt.submit_buy_order(0, buy_order_id, order_price, order_qty, time_in_force, order_type, False)\n", " else:\n", " hbt.cancel(0, buy_order_id, False)\n", " \n", " if sell_order_id not in hbt.orders(0):\n", " order_price = round((mid_price + half_spread) / depth.tick_size) * depth.tick_size\n", " order_qty = 1\n", " time_in_force = GTX\n", " order_type = LIMIT\n", " hbt.submit_sell_order(0, sell_order_id, order_price, order_qty, time_in_force, order_type, False)\n", " else:\n", " hbt.cancel(0, sell_order_id, False)\n", " \n", " recorder.record(hbt)\n", " return True" ] }, { "cell_type": "code", "execution_count": 28, "id": "a3795e40", "metadata": {}, "outputs": [], "source": [ "from hftbacktest import Recorder\n", "\n", "hbt = HashMapMarketDepthBacktest([asset])\n", "\n", "recorder = Recorder(\n", " # The number of assets\n", " hbt.num_assets,\n", " # The buffer size for records\n", " 1000000\n", ")\n", "\n", "submit_order_stats(hbt, recorder.recorder)\n", "\n", "_ = hbt.close()" ] }, { "cell_type": "markdown", "id": "083d1d1b-daa1-43cf-8ac8-615e2265ffa6", "metadata": {}, "source": [ "記録された状態を`get`メソッドを使用してアセット番号と共に取得できます。" ] }, { "cell_type": "code", "execution_count": 29, "id": "1fa63ae5-6535-48da-a728-52e0be2c8f52", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([(1723161602500000000, 61659.85, 0., 0.000000e+00, 0. , 0, 0., 0. ),\n", " (1723161603500000000, 61659.95, 1., -6.165940e+04, 12.33188, 1, 1., 61659.4),\n", " (1723161604500000000, 61670.85, 1., -6.165940e+04, 12.33188, 1, 1., 61659.4),\n", " (1723161605500000000, 61692.45, 0., 1.200000e+01, 24.66616, 2, 2., 123330.8),\n", " (1723161606500000000, 61693.95, 0., 1.300000e+01, 49.34312, 4, 4., 246715.6),\n", " (1723161607500000000, 61695.45, -1., 6.170740e+04, 61.682 , 5, 5., 308410. ),\n", " (1723161608500000000, 61709.95, -2., 1.234033e+05, 74.02118, 6, 6., 370105.9),\n", " (1723161609500000000, 61707.35, -1., 6.169390e+04, 86.36306, 7, 7., 431815.3),\n", " (1723161610500000000, 61715.85, -1., 6.169390e+04, 86.36306, 7, 7., 431815.3),\n", " (1723161611500000000, 61711.85, -2., 1.234103e+05, 98.70634, 8, 8., 493531.7),\n", " (1723161612500000000, 61713.95, -3., 1.851227e+05, 111.04882, 9, 9., 555244.1),\n", " (1723161613500000000, 61706.15, -4., 2.468371e+05, 123.3917 , 10, 10., 616958.5),\n", " (1723161614500000000, 61708.25, -5., 3.085437e+05, 135.73302, 11, 11., 678665.1),\n", " (1723161615500000000, 61699.75, -6., 3.702525e+05, 148.07478, 12, 12., 740373.9),\n", " (1723161616500000000, 61700.95, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161617500000000, 61698.05, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161618500000000, 61706.95, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161619500000000, 61695.85, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161620500000000, 61713.45, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161621500000000, 61707.65, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161622500000000, 61713.45, -7., 4.319527e+05, 160.41482, 13, 13., 802074.1),\n", " (1723161623500000000, 61704.05, -6., 3.702455e+05, 172.75626, 14, 14., 863781.3),\n", " (1723161624500000000, 61702.45, -5., 3.085419e+05, 185.09698, 15, 15., 925484.9),\n", " (1723161625500000000, 61704.65, -6., 3.702448e+05, 197.43756, 16, 16., 987187.8),\n", " (1723161626500000000, 61704.65, -6., 3.702448e+05, 197.43756, 16, 16., 987187.8),\n", " (1723161627500000000, 61695.35, -5., 3.085406e+05, 209.7784 , 17, 17., 1048892. ),\n", " (1723161628500000000, 61693.75, -4., 2.468458e+05, 222.11736, 18, 18., 1110586.8),\n", " (1723161629500000000, 61693.75, -4., 2.468458e+05, 222.11736, 18, 18., 1110586.8),\n", " (1723161630500000000, 61682.35, -4., 2.468458e+05, 222.11736, 18, 18., 1110586.8),\n", " (1723161631500000000, 61673.85, -3., 1.851640e+05, 234.45372, 19, 19., 1172268.6),\n", " (1723161632500000000, 61666.05, -2., 1.234906e+05, 246.7884 , 20, 20., 1233942. ),\n", " (1723161633500000000, 61671.05, -2., 1.234906e+05, 246.7884 , 20, 20., 1233942. ),\n", " (1723161634500000000, 61673.75, -3., 1.851622e+05, 259.12272, 21, 21., 1295613.6),\n", " (1723161635500000000, 61673.75, -3., 1.851622e+05, 259.12272, 21, 21., 1295613.6),\n", " (1723161636500000000, 61666.05, -3., 1.851622e+05, 259.12272, 21, 21., 1295613.6),\n", " (1723161637500000000, 61670.45, -4., 2.468288e+05, 271.45604, 22, 22., 1357280.2),\n", " (1723161638500000000, 61664.05, -4., 2.468288e+05, 271.45604, 22, 22., 1357280.2),\n", " (1723161639500000000, 61649.05, -3., 1.851652e+05, 283.78876, 23, 23., 1418943.8),\n", " (1723161640500000000, 61645.05, -3., 1.851652e+05, 283.78876, 23, 23., 1418943.8),\n", " (1723161641500000000, 61640.05, -2., 1.235206e+05, 296.11768, 24, 24., 1480588.4),\n", " (1723161642500000000, 61638.45, -1., 6.188100e+04, 308.4456 , 25, 25., 1542228. ),\n", " (1723161643500000000, 61636.05, 0., 2.431000e+02, 320.77318, 26, 26., 1603865.9),\n", " (1723161644500000000, 61641.95, -1., 6.187970e+04, 333.1005 , 27, 27., 1665502.5),\n", " (1723161645500000000, 61641.95, -1., 6.187970e+04, 333.1005 , 27, 27., 1665502.5),\n", " (1723161646500000000, 61644.35, -1., 6.187970e+04, 333.1005 , 27, 27., 1665502.5),\n", " (1723161647500000000, 61636.45, -1., 6.187970e+04, 333.1005 , 27, 27., 1665502.5),\n", " (1723161648500000000, 61630.05, 0., 2.438000e+02, 345.42768, 28, 28., 1727138.4),\n", " (1723161649500000000, 61630.05, 0., 2.438000e+02, 345.42768, 28, 28., 1727138.4),\n", " (1723161650500000000, 61631.65, 0., 2.438000e+02, 345.42768, 28, 28., 1727138.4),\n", " (1723161651500000000, 61639.05, -1., 6.187600e+04, 357.75412, 29, 29., 1788770.6),\n", " (1723161652500000000, 61632.05, -1., 6.187600e+04, 357.75412, 29, 29., 1788770.6),\n", " (1723161653500000000, 61633.95, -1., 6.187600e+04, 357.75412, 29, 29., 1788770.6),\n", " (1723161654500000000, 61632.05, -2., 1.235104e+05, 370.081 , 30, 30., 1850405. ),\n", " (1723161655500000000, 61604.05, -1., 6.187880e+04, 382.40732, 31, 31., 1912036.6),\n", " (1723161656500000000, 61604.05, -1., 6.187880e+04, 382.40732, 31, 31., 1912036.6),\n", " (1723161657500000000, 61607.05, -1., 6.187880e+04, 382.40732, 31, 31., 1912036.6),\n", " (1723161658500000000, 61603.15, 0., 2.722000e+02, 394.72864, 32, 32., 1973643.2),\n", " (1723161659500000000, 61601.15, 1., -6.133040e+04, 407.04916, 33, 33., 2035245.8),\n", " (1723161660500000000, 61595.35, 2., -1.229310e+05, 419.36928, 34, 34., 2096846.4),\n", " (1723161661500000000, 61594.15, 3., -1.845258e+05, 431.68824, 35, 35., 2158441.2),\n", " (1723161662500000000, 61578.15, 4., -2.461194e+05, 444.00696, 36, 36., 2220034.8),\n", " (1723161663500000000, 61565.25, 5., -3.076970e+05, 456.32248, 37, 37., 2281612.4),\n", " (1723161664500000000, 61563.65, 5., -3.076960e+05, 480.9486 , 39, 39., 2404743. ),\n", " (1723161665500000000, 61555.05, 6., -3.692592e+05, 493.26124, 40, 40., 2466306.2),\n", " (1723161666500000000, 61530.85, 7., -4.308138e+05, 505.57216, 41, 41., 2527860.8),\n", " (1723161667500000000, 61522.25, 8., -4.923442e+05, 517.87824, 42, 42., 2589391.2),\n", " (1723161668500000000, 61543. , 7., -4.308214e+05, 530.1828 , 43, 43., 2650914. ),\n", " (1723161669500000000, 61528.05, 7., -4.308214e+05, 530.1828 , 43, 43., 2650914. ),\n", " (1723161670500000000, 61539.85, 8., -4.923490e+05, 542.48832, 44, 44., 2712441.6),\n", " (1723161671500000000, 61524.15, 9., -5.538884e+05, 554.7962 , 45, 45., 2773981. ),\n", " (1723161672500000000, 61524.25, 9., -5.538884e+05, 554.7962 , 45, 45., 2773981. ),\n", " (1723161673500000000, 61535.95, 8., -4.923636e+05, 567.10116, 46, 46., 2835505.8),\n", " (1723161674500000000, 61531.45, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161675500000000, 61538.85, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161676500000000, 61536.95, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161677500000000, 61538.85, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161678500000000, 61534.75, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161679500000000, 61538.85, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161680500000000, 61538.05, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161681500000000, 61549.25, 9., -5.538990e+05, 579.40824, 47, 47., 2897041.2),\n", " (1723161682500000000, 61552.45, 8., -4.923492e+05, 591.7182 , 48, 48., 2958591. ),\n", " (1723161683500000000, 61552.45, 8., -4.923492e+05, 591.7182 , 48, 48., 2958591. ),\n", " (1723161684500000000, 61552.45, 8., -4.923492e+05, 591.7182 , 48, 48., 2958591. ),\n", " (1723161685500000000, 61565.95, 7., -4.307963e+05, 604.02878, 49, 49., 3020143.9),\n", " (1723161686500000000, 61574.45, 6., -3.692299e+05, 616.34206, 50, 50., 3081710.3),\n", " (1723161687500000000, 61587.55, 6., -3.692299e+05, 616.34206, 50, 50., 3081710.3),\n", " (1723161688500000000, 61592.95, 5., -3.076419e+05, 628.65966, 51, 51., 3143298.3),\n", " (1723161689500000000, 61592.95, 5., -3.076419e+05, 628.65966, 51, 51., 3143298.3),\n", " (1723161690500000000, 61594.15, 5., -3.076419e+05, 628.65966, 51, 51., 3143298.3),\n", " (1723161691500000000, 61598.95, 4., -2.460473e+05, 640.97858, 52, 52., 3204892.9),\n", " (1723161692500000000, 61593.05, 3., -1.844479e+05, 653.29846, 53, 53., 3266492.3),\n", " (1723161693500000000, 61582.55, 3., -1.844479e+05, 653.29846, 53, 53., 3266492.3),\n", " (1723161694500000000, 61582.55, 4., -2.460299e+05, 665.61486, 54, 54., 3328074.3),\n", " (1723161695500000000, 61582.55, 4., -2.460299e+05, 665.61486, 54, 54., 3328074.3),\n", " (1723161696500000000, 61587.15, 4., -2.460299e+05, 665.61486, 54, 54., 3328074.3),\n", " (1723161697500000000, 61587.15, 4., -2.460299e+05, 665.61486, 54, 54., 3328074.3),\n", " (1723161698500000000, 61588.75, 4., -2.460299e+05, 665.61486, 54, 54., 3328074.3),\n", " (1723161699500000000, 61586.75, 4., -2.460289e+05, 690.25034, 56, 56., 3451251.7),\n", " (1723161700500000000, 61582.05, 5., -3.076151e+05, 702.56758, 57, 57., 3512837.9),\n", " (1723161701500000000, 61572.05, 6., -3.691967e+05, 714.8839 , 58, 58., 3574419.5),\n", " (1723161702500000000, 61587.45, 5., -3.076241e+05, 727.19842, 59, 59., 3635992.1),\n", " (1723161703500000000, 61577.95, 5., -3.076241e+05, 727.19842, 59, 59., 3635992.1),\n", " (1723161704500000000, 61582.05, 5., -3.076241e+05, 727.19842, 59, 59., 3635992.1),\n", " (1723161705500000000, 61572.05, 5., -3.076189e+05, 751.83042, 61, 61., 3759152.1),\n", " (1723161706500000000, 61574.05, 4., -2.460463e+05, 764.14494, 62, 62., 3820724.7),\n", " (1723161707500000000, 61574.05, 4., -2.460463e+05, 764.14494, 62, 62., 3820724.7),\n", " (1723161708500000000, 61576.05, 3., -1.844717e+05, 776.45986, 63, 63., 3882299.3),\n", " (1723161709500000000, 61577.55, 2., -1.228951e+05, 788.77518, 64, 64., 3943875.9),\n", " (1723161710500000000, 61581.95, 1., -6.131710e+04, 801.09078, 65, 65., 4005453.9),\n", " (1723161711500000000, 61565.65, 1., -6.131710e+04, 801.09078, 65, 65., 4005453.9),\n", " (1723161712500000000, 61561.15, 2., -1.228823e+05, 813.40382, 66, 66., 4067019.1),\n", " (1723161713500000000, 61570.45, 2., -1.228813e+05, 838.02826, 68, 68., 4190141.3),\n", " (1723161714500000000, 61572.45, 1., -6.131040e+04, 850.34244, 69, 69., 4251712.2),\n", " (1723161715500000000, 61565.65, 1., -6.131040e+04, 850.34244, 69, 69., 4251712.2),\n", " (1723161716500000000, 61561.95, 2., -1.228756e+05, 862.65548, 70, 70., 4313277.4),\n", " (1723161717500000000, 61557.05, 3., -1.844370e+05, 874.96776, 71, 71., 4374838.8),\n", " (1723161718500000000, 61561.95, 3., -1.844370e+05, 874.96776, 71, 71., 4374838.8),\n", " (1723161719500000000, 61568.05, 2., -1.228746e+05, 887.28024, 72, 72., 4436401.2),\n", " (1723161720500000000, 61576.55, 1., -6.130600e+04, 899.59396, 73, 73., 4497969.8),\n", " (1723161721500000000, 61576.55, 1., -6.130600e+04, 899.59396, 73, 73., 4497969.8),\n", " (1723161722500000000, 61589.95, 1., -6.130600e+04, 899.59396, 73, 73., 4497969.8),\n", " (1723161723500000000, 61593.95, 0., 2.844000e+02, 911.91204, 74, 74., 4559560.2),\n", " (1723161724500000000, 61615.15, -1., 6.187880e+04, 924.23092, 75, 75., 4621154.6),\n", " (1723161725500000000, 61615.15, -1., 6.187880e+04, 924.23092, 75, 75., 4621154.6),\n", " (1723161726500000000, 61615.15, -1., 6.187880e+04, 924.23092, 75, 75., 4621154.6),\n", " (1723161727500000000, 61617.05, -2., 1.234944e+05, 936.55404, 76, 76., 4682770.2),\n", " (1723161728500000000, 61618.15, -3., 1.851120e+05, 948.87756, 77, 77., 4744387.8),\n", " (1723161729500000000, 61612.55, -3., 1.851120e+05, 948.87756, 77, 77., 4744387.8),\n", " (1723161730500000000, 61609.95, -2., 1.235000e+05, 961.19996, 78, 78., 4805999.8),\n", " (1723161731500000000, 61607.95, -1., 6.189060e+04, 973.52184, 79, 79., 4867609.2),\n", " (1723161732500000000, 61608.95, -1., 6.189060e+04, 973.52184, 79, 79., 4867609.2),\n", " (1723161733500000000, 61606.05, -1., 6.189060e+04, 973.52184, 79, 79., 4867609.2),\n", " (1723161734500000000, 61608.45, -1., 6.189060e+04, 973.52184, 79, 79., 4867609.2),\n", " (1723161735500000000, 61615.95, -2., 1.234995e+05, 985.84362, 80, 80., 4929218.1),\n", " (1723161736500000000, 61618.15, -3., 1.851159e+05, 998.1669 , 81, 81., 4990834.5),\n", " (1723161737500000000, 61605.55, -3., 1.851159e+05, 998.1669 , 81, 81., 4990834.5),\n", " (1723161738500000000, 61613.85, -3., 1.851159e+05, 998.1669 , 81, 81., 4990834.5),\n", " (1723161739500000000, 61619.95, -4., 2.467303e+05, 1010.48978, 82, 82., 5052448.9),\n", " (1723161740500000000, 61636.65, -4., 2.467303e+05, 1010.48978, 82, 82., 5052448.9),\n", " (1723161741500000000, 61649.75, -5., 3.083675e+05, 1022.81722, 83, 83., 5114086.1),\n", " (1723161742500000000, 61653.45, -6., 3.700177e+05, 1035.14726, 84, 84., 5175736.3),\n", " (1723161743500000000, 61668.55, -7., 4.316716e+05, 1047.47804, 85, 85., 5237390.2),\n", " (1723161744500000000, 61668.55, -7., 4.316716e+05, 1047.47804, 85, 85., 5237390.2),\n", " (1723161745500000000, 61673.45, -6., 3.700036e+05, 1059.81164, 86, 86., 5299058.2),\n", " (1723161746500000000, 61675.55, -7., 4.316775e+05, 1072.14642, 87, 87., 5360732.1),\n", " (1723161747500000000, 61671.35, -8., 4.933535e+05, 1084.48162, 88, 88., 5422408.1),\n", " (1723161748500000000, 61656.75, -7., 4.316827e+05, 1096.81578, 89, 89., 5484078.9),\n", " (1723161749500000000, 61660.05, -7., 4.316827e+05, 1096.81578, 89, 89., 5484078.9),\n", " (1723161750500000000, 61662.05, -8., 4.933433e+05, 1109.1479 , 90, 90., 5545739.5),\n", " (1723161751500000000, 61652.05, -7., 4.316817e+05, 1121.48022, 91, 91., 5607401.1),\n", " (1723161752500000000, 61673.45, -7., 4.316817e+05, 1121.48022, 91, 91., 5607401.1),\n", " (1723161753500000000, 61680.65, -8., 4.933556e+05, 1133.815 , 92, 92., 5669075. ),\n", " (1723161754500000000, 61672.45, -7., 4.316754e+05, 1146.15104, 93, 93., 5730755.2),\n", " (1723161755500000000, 61659.95, -6., 3.700035e+05, 1158.48542, 94, 94., 5792427.1),\n", " (1723161756500000000, 61661.25, -7., 4.316639e+05, 1170.8175 , 95, 95., 5854087.5),\n", " (1723161757500000000, 61654.25, -7., 4.316639e+05, 1170.8175 , 95, 95., 5854087.5),\n", " (1723161758500000000, 61650.05, -6., 3.700101e+05, 1183.14826, 96, 96., 5915741.3),\n", " (1723161759500000000, 61650.05, -6., 3.700101e+05, 1183.14826, 96, 96., 5915741.3),\n", " (1723161760500000000, 61654.25, -6., 3.700101e+05, 1183.14826, 96, 96., 5915741.3),\n", " (1723161761500000000, 61652.65, -5., 3.083563e+05, 1195.47902, 97, 97., 5977395.1),\n", " (1723161762500000000, 61663.95, -5., 3.083563e+05, 1195.47902, 97, 97., 5977395.1),\n", " (1723161763500000000, 61656.05, -5., 3.083563e+05, 1195.47902, 97, 97., 5977395.1),\n", " (1723161764500000000, 61656.05, -6., 3.700129e+05, 1207.81034, 98, 98., 6039051.7),\n", " (1723161765500000000, 61626.35, -6., 3.700129e+05, 1207.81034, 98, 98., 6039051.7),\n", " (1723161766500000000, 61629.85, -6., 3.700129e+05, 1207.81034, 98, 98., 6039051.7),\n", " (1723161767500000000, 61629.85, -6., 3.700129e+05, 1207.81034, 98, 98., 6039051.7),\n", " (1723161768500000000, 61633.05, -6., 3.700129e+05, 1207.81034, 98, 98., 6039051.7),\n", " (1723161769500000000, 61645.45, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161770500000000, 61645.45, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161771500000000, 61649.75, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161772500000000, 61640.85, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161773500000000, 61642.05, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161774500000000, 61629.85, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161775500000000, 61629.75, -7., 4.316465e+05, 1220.13706, 99, 99., 6100685.3),\n", " (1723161776500000000, 61635.25, -8., 4.932767e+05, 1232.4631 , 100, 100., 6162315.5),\n", " (1723161777500000000, 61618.75, -7., 4.316419e+05, 1244.79006, 101, 101., 6223950.3),\n", " (1723161778500000000, 61615.75, -6., 3.700237e+05, 1257.1137 , 102, 102., 6285568.5),\n", " (1723161779500000000, 61602.7 , -5., 3.084085e+05, 1269.43674, 103, 103., 6347183.7),\n", " (1723161780500000000, 61609.75, -4., 2.468063e+05, 1281.75718, 104, 104., 6408785.9),\n", " (1723161781500000000, 61629.65, -5., 3.084165e+05, 1294.07922, 105, 105., 6470396.1),\n", " (1723161782500000000, 61634.15, -6., 3.700467e+05, 1306.40526, 106, 106., 6532026.3),\n", " (1723161783500000000, 61631.95, -5., 3.084131e+05, 1318.73198, 107, 107., 6593659.9),\n", " (1723161784500000000, 61625.55, -4., 2.467817e+05, 1331.05826, 108, 108., 6655291.3),\n", " (1723161785500000000, 61617.05, -3., 1.851567e+05, 1343.38326, 109, 109., 6716916.3),\n", " (1723161786500000000, 61620.05, -2., 1.235401e+05, 1355.70658, 110, 110., 6778532.9),\n", " (1723161787500000000, 61620.05, -2., 1.235401e+05, 1355.70658, 110, 110., 6778532.9),\n", " (1723161788500000000, 61620.05, -2., 1.235401e+05, 1355.70658, 110, 110., 6778532.9),\n", " (1723161789500000000, 61617.05, -1., 6.192050e+04, 1368.0305 , 111, 111., 6840152.5),\n", " (1723161790500000000, 61616.15, 0., 3.039000e+02, 1380.35382, 112, 112., 6901769.1),\n", " (1723161791500000000, 61616.15, 0., 3.039000e+02, 1380.35382, 112, 112., 6901769.1),\n", " (1723161792500000000, 61618.05, 0., 3.039000e+02, 1380.35382, 112, 112., 6901769.1),\n", " (1723161793500000000, 61642.05, -1., 6.192250e+04, 1392.67754, 113, 113., 6963387.7),\n", " (1723161794500000000, 61649.95, -2., 1.235651e+05, 1405.00606, 114, 114., 7025030.3),\n", " (1723161795500000000, 61666.45, -3., 1.852155e+05, 1417.33614, 115, 115., 7086680.7),\n", " (1723161796500000000, 61658.05, -3., 1.852155e+05, 1417.33614, 115, 115., 7086680.7),\n", " (1723161797500000000, 61648.45, -2., 1.235579e+05, 1429.66766, 116, 116., 7148338.3),\n", " (1723161798500000000, 61642.05, -2., 1.235589e+05, 1454.32702, 118, 118., 7271635.1),\n", " (1723161799500000000, 61638.85, -1., 6.191730e+04, 1466.65534, 119, 119., 7333276.7),\n", " (1723161800500000000, 61631.95, 0., 2.789000e+02, 1478.98302, 120, 120., 7394915.1),\n", " (1723161801500000000, 61623.05, 1., -6.135250e+04, 1491.3093 , 121, 121., 7456546.5),\n", " (1723161802500000000, 61626.65, 1., -6.135250e+04, 1491.3093 , 121, 121., 7456546.5),\n", " (1723161803500000000, 61625.05, 1., -6.135250e+04, 1491.3093 , 121, 121., 7456546.5),\n", " (1723161804500000000, 61612.05, 2., -1.229771e+05, 1503.63422, 122, 122., 7518171.1),\n", " (1723161805500000000, 61618.05, 1., -6.136450e+04, 1515.95674, 123, 123., 7579783.7),\n", " (1723161806500000000, 61616.15, 1., -6.136450e+04, 1515.95674, 123, 123., 7579783.7),\n", " (1723161807500000000, 61616.15, 1., -6.136450e+04, 1515.95674, 123, 123., 7579783.7),\n", " (1723161808500000000, 61602.45, 1., -6.136450e+04, 1515.95674, 123, 123., 7579783.7),\n", " (1723161809500000000, 61592.05, 2., -1.229664e+05, 1528.27712, 124, 124., 7641385.6),\n", " (1723161810500000000, 61580.25, 3., -1.845580e+05, 1540.59544, 125, 125., 7702977.2),\n", " (1723161811500000000, 61580.25, 3., -1.845580e+05, 1540.59544, 125, 125., 7702977.2),\n", " (1723161812500000000, 61586.25, 2., -1.229772e+05, 1552.9116 , 126, 126., 7764558. ),\n", " (1723161813500000000, 61594.45, 1., -6.139040e+04, 1565.22896, 127, 127., 7826144.8),\n", " (1723161814500000000, 61606.85, 0., 2.045000e+02, 1577.54794, 128, 128., 7887739.7),\n", " (1723161815500000000, 61630.35, -1., 6.181190e+04, 1589.86942, 129, 129., 7949347.1),\n", " (1723161816500000000, 61638.05, -2., 1.234427e+05, 1602.19558, 130, 130., 8010977.9),\n", " (1723161817500000000, 61626.25, -2., 1.234427e+05, 1602.19558, 130, 130., 8010977.9),\n", " (1723161818500000000, 61626.25, -2., 1.234427e+05, 1602.19558, 130, 130., 8010977.9),\n", " (1723161819500000000, 61613.65, -2., 1.234427e+05, 1602.19558, 130, 130., 8010977.9),\n", " (1723161820500000000, 61608.15, -1., 6.182950e+04, 1614.51822, 131, 131., 8072591.1),\n", " (1723161821500000000, 61624.65, -2., 1.234381e+05, 1626.83994, 132, 132., 8134199.7),\n", " (1723161822500000000, 61624.65, -2., 1.234381e+05, 1626.83994, 132, 132., 8134199.7),\n", " (1723161823500000000, 61624.65, -2., 1.234381e+05, 1626.83994, 132, 132., 8134199.7),\n", " (1723161824500000000, 61624.65, -2., 1.234381e+05, 1626.83994, 132, 132., 8134199.7),\n", " (1723161825500000000, 61622.55, -1., 6.181390e+04, 1639.16478, 133, 133., 8195823.9),\n", " (1723161826500000000, 61622.55, -1., 6.181390e+04, 1639.16478, 133, 133., 8195823.9),\n", " (1723161827500000000, 61621.65, -1., 6.181390e+04, 1639.16478, 133, 133., 8195823.9),\n", " (1723161828500000000, 61615.95, 0., 1.927000e+02, 1651.48902, 134, 134., 8257445.1),\n", " (1723161829500000000, 61621.55, 1., -6.142270e+04, 1663.8121 , 135, 135., 8319060.5),\n", " (1723161830500000000, 61621.55, 1., -6.142270e+04, 1663.8121 , 135, 135., 8319060.5),\n", " (1723161831500000000, 61614.05, 1., -6.142270e+04, 1663.8121 , 135, 135., 8319060.5),\n", " (1723161832500000000, 61611.55, 2., -1.230363e+05, 1676.13482, 136, 136., 8380674.1),\n", " (1723161833500000000, 61620.05, 2., -1.230363e+05, 1676.13482, 136, 136., 8380674.1),\n", " (1723161834500000000, 61622.55, 1., -6.141570e+04, 1688.45894, 137, 137., 8442294.7),\n", " (1723161835500000000, 61621.55, 1., -6.141470e+04, 1713.10794, 139, 139., 8565539.7),\n", " (1723161836500000000, 61630.35, 0., 2.073000e+02, 1725.43234, 140, 140., 8627161.7),\n", " (1723161837500000000, 61613.75, -1., 6.183810e+04, 1737.7585 , 141, 141., 8688792.5),\n", " (1723161838500000000, 61613.75, -1., 6.183810e+04, 1737.7585 , 141, 141., 8688792.5),\n", " (1723161839500000000, 61605.05, -1., 6.183810e+04, 1737.7585 , 141, 141., 8688792.5),\n", " (1723161840500000000, 61616.05, -2., 1.234437e+05, 1750.07962, 142, 142., 8750398.1),\n", " (1723161841500000000, 61621.55, -3., 1.850603e+05, 1762.40294, 143, 143., 8812014.7),\n", " (1723161842500000000, 61633.95, -4., 2.466823e+05, 1774.72734, 144, 144., 8873636.7),\n", " (1723161843500000000, 61638.05, -5., 3.083167e+05, 1787.05422, 145, 145., 8935271.1),\n", " (1723161844500000000, 61634.95, -4., 2.466791e+05, 1799.38174, 146, 146., 8996908.7),\n", " (1723161845500000000, 61634.95, -4., 2.466791e+05, 1799.38174, 146, 146., 8996908.7),\n", " (1723161846500000000, 61638.05, -5., 3.083145e+05, 1811.70882, 147, 147., 9058544.1),\n", " (1723161847500000000, 61634.95, -5., 3.083155e+05, 1836.36406, 149, 149., 9181820.3),\n", " (1723161848500000000, 61626.05, -4., 2.466811e+05, 1848.69094, 150, 150., 9243454.7),\n", " (1723161849500000000, 61629.95, -4., 2.466811e+05, 1848.69094, 150, 150., 9243454.7),\n", " (1723161850500000000, 61629.95, -4., 2.466811e+05, 1848.69094, 150, 150., 9243454.7),\n", " (1723161851500000000, 61632.25, -4., 2.466811e+05, 1848.69094, 150, 150., 9243454.7),\n", " (1723161852500000000, 61635.95, -5., 3.083139e+05, 1861.0175 , 151, 151., 9305087.5),\n", " (1723161853500000000, 61635.95, -5., 3.083139e+05, 1861.0175 , 151, 151., 9305087.5),\n", " (1723161854500000000, 61638.05, -5., 3.083139e+05, 1861.0175 , 151, 151., 9305087.5),\n", " (1723161855500000000, 61636.25, -4., 2.466763e+05, 1873.34502, 152, 152., 9366725.1),\n", " (1723161856500000000, 61638.05, -4., 2.466763e+05, 1873.34502, 152, 152., 9366725.1),\n", " (1723161857500000000, 61636.05, -5., 3.083149e+05, 1885.67274, 153, 153., 9428363.7),\n", " (1723161858500000000, 61641.45, -6., 3.699515e+05, 1898.00006, 154, 154., 9490000.3),\n", " (1723161859500000000, 61641.45, -6., 3.699515e+05, 1898.00006, 154, 154., 9490000.3),\n", " (1723161860500000000, 61643.25, -6., 3.699515e+05, 1898.00006, 154, 154., 9490000.3),\n", " (1723161861500000000, 61657.25, -7., 4.315953e+05, 1910.32882, 155, 155., 9551644.1),\n", " (1723161862500000000, 61671.45, -8., 4.932531e+05, 1922.66038, 156, 156., 9613301.9),\n", " (1723161863500000000, 61668.05, -8., 4.932531e+05, 1922.66038, 156, 156., 9613301.9),\n", " (1723161864500000000, 61669.15, -8., 4.932531e+05, 1922.66038, 156, 156., 9613301.9),\n", " (1723161865500000000, 61666.75, -8., 4.932531e+05, 1922.66038, 156, 156., 9613301.9),\n", " (1723161866500000000, 61665.05, -7., 4.315869e+05, 1934.99362, 157, 157., 9674968.1),\n", " (1723161867500000000, 61657.15, -6., 3.699223e+05, 1947.32654, 158, 158., 9736632.7),\n", " (1723161868500000000, 61657.15, -6., 3.699223e+05, 1947.32654, 158, 158., 9736632.7),\n", " (1723161869500000000, 61657.15, -6., 3.699223e+05, 1947.32654, 158, 158., 9736632.7),\n", " (1723161870500000000, 61657.15, -6., 3.699223e+05, 1947.32654, 158, 158., 9736632.7),\n", " (1723161871500000000, 61666.75, -7., 4.315799e+05, 1959.65806, 159, 159., 9798290.3),\n", " (1723161872500000000, 61651.55, -6., 3.699137e+05, 1971.9913 , 160, 160., 9859956.5),\n", " (1723161873500000000, 61638.05, -5., 3.082627e+05, 1984.3215 , 161, 161., 9921607.5),\n", " (1723161874500000000, 61634.35, -4., 2.466251e+05, 1996.64902, 162, 162., 9983245.1),\n", " (1723161875500000000, 61638.85, -4., 2.466251e+05, 1996.64902, 162, 162., 9983245.1),\n", " (1723161876500000000, 61638.15, -5., 3.082645e+05, 2008.9769 , 163, 163., 10044884.5),\n", " (1723161877500000000, 61621.65, -4., 2.466269e+05, 2021.30442, 164, 164., 10106522.1),\n", " (1723161878500000000, 61611.65, -3., 1.850057e+05, 2033.62866, 165, 165., 10168143.3),\n", " (1723161879500000000, 61614.95, -4., 2.466179e+05, 2045.9511 , 166, 166., 10229755.5),\n", " (1723161880500000000, 61614.15, -4., 2.466179e+05, 2045.9511 , 166, 166., 10229755.5),\n", " (1723161881500000000, 61614.15, -4., 2.466179e+05, 2045.9511 , 166, 166., 10229755.5),\n", " (1723161882500000000, 61614.15, -4., 2.466179e+05, 2045.9511 , 166, 166., 10229755.5),\n", " (1723161883500000000, 61616.15, -4., 2.466179e+05, 2045.9511 , 166, 166., 10229755.5),\n", " (1723161884500000000, 61623.95, -5., 3.082345e+05, 2058.27442, 167, 167., 10291372.1),\n", " (1723161885500000000, 61627.95, -6., 3.698589e+05, 2070.5993 , 168, 168., 10352996.5),\n", " (1723161886500000000, 61621.45, -6., 3.698589e+05, 2070.5993 , 168, 168., 10352996.5),\n", " (1723161887500000000, 61620.45, -5., 3.082380e+05, 2082.92348, 169, 169., 10414617.4),\n", " (1723161888500000000, 61617.55, -4., 2.466181e+05, 2095.24746, 170, 170., 10476237.3),\n", " (1723161889500000000, 61609.45, -3., 1.850011e+05, 2107.57086, 171, 171., 10537854.3),\n", " (1723161890500000000, 61609.45, -3., 1.850011e+05, 2107.57086, 171, 171., 10537854.3),\n", " (1723161891500000000, 61605.95, -3., 1.850011e+05, 2107.57086, 171, 171., 10537854.3),\n", " (1723161892500000000, 61605.95, -3., 1.850011e+05, 2107.57086, 171, 171., 10537854.3),\n", " (1723161893500000000, 61596.55, -3., 1.850011e+05, 2107.57086, 171, 171., 10537854.3),\n", " (1723161894500000000, 61595.65, -2., 1.234051e+05, 2119.89006, 172, 172., 10599450.3),\n", " (1723161895500000000, 61580.75, -1., 6.180990e+04, 2132.2091 , 173, 173., 10661045.5),\n", " (1723161896500000000, 61575.05, 0., 2.297000e+02, 2144.52514, 174, 174., 10722625.7),\n", " (1723161897500000000, 61585.05, 0., 2.297000e+02, 2144.52514, 174, 174., 10722625.7),\n", " (1723161898500000000, 61578.25, 0., 2.297000e+02, 2144.52514, 174, 174., 10722625.7),\n", " (1723161899500000000, 61578.25, 0., 2.297000e+02, 2144.52514, 174, 174., 10722625.7),\n", " (1723161900500000000, 61583.95, -1., 6.180850e+04, 2156.8409 , 175, 175., 10784204.5),\n", " (1723161901500000000, 61583.95, -1., 6.180850e+04, 2156.8409 , 175, 175., 10784204.5),\n", " (1723161902500000000, 61583.95, -1., 6.180850e+04, 2156.8409 , 175, 175., 10784204.5),\n", " (1723161903500000000, 61585.05, -2., 1.233929e+05, 2169.15778, 176, 176., 10845788.9)],\n", " dtype={'names': ['timestamp', 'price', 'position', 'balance', 'fee', 'num_trades', 'trading_volume', 'trading_value'], 'formats': ['\n", "shape: (1, 11)
startendSRSortinoReturnMaxDrawdownDailyNumberOfTradesDailyTradingValueReturnOverMDDReturnOverTradeMaxPositionValue
datetime[μs]datetime[μs]f64f64f64f64f64f64f64f64f64
2024-08-09 00:00:002024-08-09 00:05:00-624.497686-664.628958-1846.544721902.1877850688.03.1236e9-0.970748-0.00017553849.65
" ], "text/plain": [ "shape: (1, 11)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ start ┆ end ┆ SR ┆ Sortino ┆ … ┆ DailyTrad ┆ ReturnOve ┆ ReturnOve ┆ MaxPosit │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ ingValue ┆ rMDD ┆ rTrade ┆ ionValue │\n", "│ datetime[ ┆ datetime[ ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ μs] ┆ μs] ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 2024-08-0 ┆ 2024-08-0 ┆ -624.4976 ┆ -664.6289 ┆ … ┆ 3.1236e9 ┆ -0.970748 ┆ -0.00017 ┆ 553849.6 │\n", "│ 9 ┆ 9 ┆ 86 ┆ 58 ┆ ┆ ┆ ┆ ┆ 5 │\n", "│ 00:00:00 ┆ 00:05:00 ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from hftbacktest.stats import LinearAssetRecord\n", "\n", "# Constructs the LinearAssetRecord from the recorded data.\n", "record = LinearAssetRecord(recorder.get(0))\n", "\n", "# Generates the statistics.\n", "# You can generate monthly and daily statistics, as well as custom metrics.\n", "stats = record.stats()\n", "\n", "# Prints the summary.\n", "stats.summary()" ] }, { "cell_type": "code", "execution_count": 32, "id": "44333854-c0d0-47a1-bc84-699e5d08b3c4", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stats.plot()" ] }, { "cell_type": "markdown", "id": "023d8490-71f9-46ac-8fe1-db7c1f3626d4", "metadata": {}, "source": [ "Holoviewsを使用したBokehもサポートされています。" ] }, { "cell_type": "code", "execution_count": 33, "id": "01b54083-5fa9-4d9d-b638-6cfa79ed6ef7", "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", " var py_version = '3.4.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n", " var reloading = false;\n", " var Bokeh = root.Bokeh;\n", "\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks;\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", " if (js_modules == null) js_modules = [];\n", " if (js_exports == null) js_exports = {};\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", "\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " if (!reloading) {\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " }\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", " window._bokeh_on_load = on_load\n", "\n", " function on_error() {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " var skip = [];\n", " if (window.requirejs) {\n", " window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n", " root._bokeh_is_loading = css_urls.length + 0;\n", " } else {\n", " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", " }\n", "\n", " var existing_stylesheets = []\n", " var links = document.getElementsByTagName('link')\n", " for (var i = 0; i < links.length; i++) {\n", " var link = links[i]\n", " if (link.href != null) {\n", "\texisting_stylesheets.push(link.href)\n", " }\n", " }\n", " for (var i = 0; i < css_urls.length; i++) {\n", " var url = css_urls[i];\n", " if (existing_stylesheets.indexOf(url) !== -1) {\n", "\ton_load()\n", "\tcontinue;\n", " }\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " } var existing_scripts = []\n", " var scripts = document.getElementsByTagName('script')\n", " for (var i = 0; i < scripts.length; i++) {\n", " var script = scripts[i]\n", " if (script.src != null) {\n", "\texisting_scripts.push(script.src)\n", " }\n", " }\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " for (var i = 0; i < js_modules.length; i++) {\n", " var url = js_modules[i];\n", " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " element.type = \"module\";\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " for (const name in js_exports) {\n", " var url = js_exports[name];\n", " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.type = \"module\";\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " element.textContent = `\n", " import ${name} from \"${url}\"\n", " window.${name} = ${name}\n", " window._bokeh_on_load()\n", " `\n", " document.head.appendChild(element);\n", " }\n", " if (!js_urls.length && !js_modules.length) {\n", " on_load()\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.2.min.js\", \"https://cdn.holoviz.org/panel/1.4.4/dist/panel.min.js\"];\n", " var js_modules = [];\n", " var js_exports = {};\n", " var css_urls = [];\n", " var inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {} // ensure no trailing comma for IE\n", " ];\n", "\n", " function run_inline_js() {\n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", "\ttry {\n", " inline_js[i].call(root, root.Bokeh);\n", "\t} catch(e) {\n", "\t if (!reloading) {\n", "\t throw e;\n", "\t }\n", "\t}\n", " }\n", " // Cache old bokeh versions\n", " if (Bokeh != undefined && !reloading) {\n", "\tvar NewBokeh = root.Bokeh;\n", "\tif (Bokeh.versions === undefined) {\n", "\t Bokeh.versions = new Map();\n", "\t}\n", "\tif (NewBokeh.version !== Bokeh.version) {\n", "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", "\t}\n", "\troot.Bokeh = Bokeh;\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " }\n", " root._bokeh_is_initializing = false\n", " }\n", "\n", " function load_or_wait() {\n", " // Implement a backoff loop that tries to ensure we do not load multiple\n", " // versions of Bokeh and its dependencies at the same time.\n", " // In recent versions we use the root._bokeh_is_initializing flag\n", " // to determine whether there is an ongoing attempt to initialize\n", " // bokeh, however for backward compatibility we also try to ensure\n", " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", " // before older versions are fully initialized.\n", " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", " root._bokeh_is_initializing = false;\n", " root._bokeh_onload_callbacks = undefined;\n", " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", " load_or_wait();\n", " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", " setTimeout(load_or_wait, 100);\n", " } else {\n", " root._bokeh_is_initializing = true\n", " root._bokeh_onload_callbacks = []\n", " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", " if (!reloading && !bokeh_loaded) {\n", "\troot.Bokeh = undefined;\n", " }\n", " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", "\trun_inline_js();\n", " });\n", " }\n", " }\n", " // Give older versions of the autoload script a head-start to ensure\n", " // they initialize before we start loading newer version.\n", " setTimeout(load_or_wait, 100)\n", "}(window));" ], "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.4.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = false;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.2.min.js\", \"https://cdn.holoviz.org/panel/1.4.4/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", "}\n", "\n", "\n", " function JupyterCommManager() {\n", " }\n", "\n", " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", " comm_manager.register_target(comm_id, function(comm) {\n", " comm.on_msg(msg_handler);\n", " });\n", " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", " comm.onMsg = msg_handler;\n", " });\n", " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", " var messages = comm.messages[Symbol.asyncIterator]();\n", " function processIteratorResult(result) {\n", " var message = result.value;\n", " console.log(message)\n", " var content = {data: message.data, comm_id};\n", " var buffers = []\n", " for (var buffer of message.buffers || []) {\n", " buffers.push(new DataView(buffer))\n", " }\n", " var metadata = message.metadata || {};\n", " var msg = {content, buffers, metadata}\n", " msg_handler(msg);\n", " return messages.next().then(processIteratorResult);\n", " }\n", " return messages.next().then(processIteratorResult);\n", " })\n", " }\n", " }\n", "\n", " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", " if (comm_id in window.PyViz.comms) {\n", " return window.PyViz.comms[comm_id];\n", " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", " if (msg_handler) {\n", " comm.on_msg(msg_handler);\n", " }\n", " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", " comm.open();\n", " if (msg_handler) {\n", " comm.onMsg = msg_handler;\n", " }\n", " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", " comm_promise.then((comm) => {\n", " window.PyViz.comms[comm_id] = comm;\n", " if (msg_handler) {\n", " var messages = comm.messages[Symbol.asyncIterator]();\n", " function processIteratorResult(result) {\n", " var message = result.value;\n", " var content = {data: message.data};\n", " var metadata = message.metadata || {comm_id};\n", " var msg = {content, metadata}\n", " msg_handler(msg);\n", " return messages.next().then(processIteratorResult);\n", " }\n", " return messages.next().then(processIteratorResult);\n", " }\n", " }) \n", " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", " return comm_promise.then((comm) => {\n", " comm.send(data, metadata, buffers, disposeOnDone);\n", " });\n", " };\n", " var comm = {\n", " send: sendClosure\n", " };\n", " }\n", " window.PyViz.comms[comm_id] = comm;\n", " return comm;\n", " }\n", " window.PyViz.comm_manager = new JupyterCommManager();\n", " \n", "\n", "\n", "var JS_MIME_TYPE = 'application/javascript';\n", "var HTML_MIME_TYPE = 'text/html';\n", "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", "var CLASS_NAME = 'output';\n", "\n", "/**\n", " * Render data to the DOM node\n", " */\n", "function render(props, node) {\n", " var div = document.createElement(\"div\");\n", " var script = document.createElement(\"script\");\n", " node.appendChild(div);\n", " node.appendChild(script);\n", "}\n", "\n", "/**\n", " * Handle when a new output is added\n", " */\n", "function handle_add_output(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", " if (id !== undefined) {\n", " var nchildren = toinsert.length;\n", " var html_node = toinsert[nchildren-1].children[0];\n", " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", " var scripts = [];\n", " var nodelist = html_node.querySelectorAll(\"script\");\n", " for (var i in nodelist) {\n", " if (nodelist.hasOwnProperty(i)) {\n", " scripts.push(nodelist[i])\n", " }\n", " }\n", "\n", " scripts.forEach( function (oldScript) {\n", " var newScript = document.createElement(\"script\");\n", " var attrs = [];\n", " var nodemap = oldScript.attributes;\n", " for (var j in nodemap) {\n", " if (nodemap.hasOwnProperty(j)) {\n", " attrs.push(nodemap[j])\n", " }\n", " }\n", " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", " oldScript.parentNode.replaceChild(newScript, oldScript);\n", " });\n", " if (JS_MIME_TYPE in output.data) {\n", " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", " }\n", " output_area._hv_plot_id = id;\n", " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", " window.PyViz.plot_index[id] = Bokeh.index[id];\n", " } else {\n", " window.PyViz.plot_index[id] = null;\n", " }\n", " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", "}\n", "\n", "/**\n", " * Handle when an output is cleared or removed\n", " */\n", "function handle_clear_output(event, handle) {\n", " var id = handle.cell.output_area._hv_plot_id;\n", " var server_id = handle.cell.output_area._bokeh_server_id;\n", " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", " if (server_id !== null) {\n", " comm.send({event_type: 'server_delete', 'id': server_id});\n", " return;\n", " } else if (comm !== null) {\n", " comm.send({event_type: 'delete', 'id': id});\n", " }\n", " delete PyViz.plot_index[id];\n", " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", " var doc = window.Bokeh.index[id].model.document\n", " doc.clear();\n", " const i = window.Bokeh.documents.indexOf(doc);\n", " if (i > -1) {\n", " window.Bokeh.documents.splice(i, 1);\n", " }\n", " }\n", "}\n", "\n", "/**\n", " * Handle kernel restart event\n", " */\n", "function handle_kernel_cleanup(event, handle) {\n", " delete PyViz.comms[\"hv-extension-comm\"];\n", " window.PyViz.plot_index = {}\n", "}\n", "\n", "/**\n", " * Handle update_display_data messages\n", " */\n", "function handle_update_output(event, handle) {\n", " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", " handle_add_output(event, handle)\n", "}\n", "\n", "function register_renderer(events, OutputArea) {\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[0]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " events.on('output_added.OutputArea', handle_add_output);\n", " events.on('output_updated.OutputArea', handle_update_output);\n", " events.on('clear_output.CodeCell', handle_clear_output);\n", " events.on('delete.Cell', handle_clear_output);\n", " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", "\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " safe: true,\n", " index: 0\n", " });\n", "}\n", "\n", "if (window.Jupyter !== undefined) {\n", " try {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " } catch(err) {\n", " }\n", "}\n" ], "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ] }, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p1100" } }, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n", " \n", " \n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":Layout\n", " .Overlay.Equity :Overlay\n", " .Curve.Equity :Curve [x] (Equity)\n", " .Curve.Equity_w_over_o_fee :Curve [x] (Equity)\n", " .Curve.Price :Curve [x] (Price)\n", " .Overlay.Position :Overlay\n", " .Curve.Position :Curve [x] (Position (Qty))\n", " .Curve.Price :Curve [x] (Price)" ] }, "execution_count": 33, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p1102" } }, "output_type": "execute_result" } ], "source": [ "import holoviews as hv\n", "hv.extension('bokeh')\n", "\n", "stats.plot(backend='holoviews')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.14" } }, "nbformat": 4, "nbformat_minor": 5 }